/**
 * 通用datagrid service模块，提供对datagrid的常用功能支持
 * 
 * @Date: 2015-6-16
 * @author: Jackson wang
 * @version: 1.0
 * @since: 1.0
 */
define(["jquery","msgServ","elServ","ajaxServ","formServ"], 
	function($,msgServ,elServ,ajaxServ,formServ) {

			'use strict';

			

			var public_method = {
				mergeCellsByField:function(_options){
					private_method.mergeCellsByField(_options)
				},
				/**
				 * 获取目标datagrid选中的行id
				 * @param _options.target 目标datagrid对象
				 * @param _options.id id字段名称，默认值为'id'
				 * @return String  "," 分隔的选中行id字符串
				 */
				getCheckedIds:function(_options){
					var _id = _options.id,_grid = _options.target;
					var _id =_id==null?'id':_id
					var selectRows=$(_grid).datagrid("getSelections");
					if((selectRows==null)||(selectRows.length<=0)){
						return 
					}else{
						 var isCheckedIds=[];
						 $.each(selectRows,function(i,e){
							 isCheckedIds.push(e[_id]);
						 });
						 return isCheckedIds.toString();
					}
				},

				/**
				 * 根据表单名称获取表单字段值，并生成json对象返回
				 * 
				 * @param _options.target
				 *            datagrid对象
				 * @param _options.data
				 *            待添加的数据行
				 * @param _options.container
				 *            目标datagrid对象的上级容器
				 * @return 表单json对象
				 * 
				 */
				addRow : function(_options) {
					// 判断目标对象参数类型，获取目标对象
					var retVal;
					var _data = getData(_options);
					var _target = getTarget(_options);
					// 判断目标对象是否为空
					if (_data != null && _target != null) {
						// 判断待添加数据是否为空
						$(_target).datagrid('appendRow', _options.data);
						retVal = 1;
					}
					return retVal;
				},

				/**
				 * 在datagrid对象指定行之前添加一条数据
				 * 
				 * @param options.datagrid
				 *            目标对象
				 * @param options.data
				 *            待添加的数据对象
				 * @param options.index
				 *            参照行序号
				 * @return 添加成功返回1，添加失败返回0，数据对象为空返回-1，目标对象为空返回-2
				 */
				insertRowBefore : function(_options) {
					var retVal;
					var _data = getData(_options);
					var _target = getTarget(_options);
					// 判断目标对象是否为空
					if (_data != null && _target != null) {

						var _rowIndex = _options.index != null
								? _options.index
								: $(_target).datagrid('getRowIndex',
										$(_target).datagrid('getSelected'));

						// 判断待添加数据是否为空
						if (_rowIndex > 0) {
							$(_target).datagrid('insertRow', {
										index : _rowIndex,
										data : _data
									});
							retVal = 1;
						}
					}
					return retVal;
				},

				/**
				 * 在datagrid对象指定行之后添加一条数据
				 * 
				 * @param options.datagrid
				 *            目标对象
				 * @param options.data
				 *            待添加的数据对象
				 * @param options.index
				 *            参照行序号
				 * @return 添加成功返回1，添加失败返回0，数据对象为空返回-1，目标对象为空返回-2
				 */
				insertRowAfter : function() {
					var retVal;
					var _data = getData(_options);
					var _target = getTarget(_options);
					// 判断目标对象是否为空
					if (_data != null && _target != null) {

						var _rowIndex = _options.index != null
								? _options.index
								: $(_target).datagrid('getRowIndex',
										$(_target).datagrid('getSelected'));

						// 判断待添加数据是否为空
						if (_rowIndex > 0) {
							$(_target).datagrid('insertRow', {
										index : _rowIndex + 1,
										data : _data
									});
							retVal = 1;
						}
					}
					return retVal;
				},

				/**
				 * 更新datagrid对象指定行的数据
				 * 
				 * @param options.grid
				 *            目标列表对象
				 * @param options.data
				 *            待添加的数据对象
				 * @param options.index
				 *            目标行序号		
				 * @param _options.loadParam
				 * 				grid刷新参数		       
				 * @return 更新成功返回1，失败返回空值
				 */
				updateRow : function(_options) {
					var retVal = 0;
					var updateFlag = false;
					var _grid = _options.grid,_index = _options.index,_data = _options.data;
					
					//未传递grid，退出
					if(!_grid || _grid.length<1){
						return
					}
					// 判断目标更新操作还是编辑操作是否为空
					if (_index != null) {
						// 判断待添加数据是否为空
						if (_index > 0) {
							updateFlag = true;
						}
					}
					
					if(_data!=null){
						_index = $(_grid).datagrid('getRowIndex',  _data);
						if(_index>0){
							updateFlag = true;
						}
					}
					
					if(updateFlag){
						$(_grid).datagrid('updateRow', {
									index : _index,
									data : _data
								});
						retVal = 1;
					}else{
//						if(_options.loadParam)
//							$(_grid).datagrid('load',_options.loadParam)
//						else
							$(_grid).datagrid('reload')
					}
					return retVal;
				},
				/**
				 * 保存form对象的数据并刷新grid
				 * @argument flag
				 * 			  按钮禁用标志
				 * @param _options.grid
				 *            目标列表对象				 
				 * @param _options.form          
				 *            目标form对象
				 * @param _options.url
				 * 			  保存url   
				 * @param _options.callback
				 * 			  回调函数   
				 * @param _options.flowid
				 * 			  模块流程定义id   
				 * @param _options.fullBizcode
				 * 			  模块业务代码        
				 * @param _options.loadParam
				 * 			  数据过滤参数
				 * @param _options.externalValue
				 * 			  附加数据
				 * @param _options.validate
				 * 			  保存验证标志
				 * 
				 * @param evt		按钮事件
				 * 
				 * @return 更新成功返回1，失败返回空值
				 * 
				 * 
				 */
				save:function(_options,evt){
					var _form = _options.form,_grid = _options.grid,_url = _options.url,_callback;
					
					//表单验证,已填写内容验证无法通过，暂缓启用
//					if(_options && _options.validate){
//						if(_options.form){
//							var validateStatus =$(_options.form).form('enableValidation').form('validate');
//							if(!validateStatus){
//								msgServ.Msgslide("请填写表单内容");
//								return
//							}
//						}
//					}
					if(_options.callback){
						//外部模块调用源，封装回调数据
						_callback = function(data){
							if(data &&　data.id){
								$(_form).form('load',data)
							}
							_options.data = data
							_options.callback(_options)
							if(evt && evt.currentTarget){
								$(evt.currentTarget).linkbutton('enable');
							}
						}
					}else{
						//本地模块调用，直接调用更新数据
						_callback =function(data){
							$(_form).form('load',data)
							//判断是否传递grid参数
							if(_grid && _grid.length>=1){
								var _param={grid:_grid,data:data}
								//grid刷新参数
								if(_options.loadParam)
									_param.loadParam=_options.loadParam
								public_method.updateRow(_param)
							}
							
							if(evt && evt.currentTarget){
								$(evt.currentTarget).linkbutton('enable');
							}
							msgServ.Msgslide('操作成功');
						}
					}
					var formData = formServ.getDataObj({
								form : $(_form)
							});
					if(_options.flowid){
						formData.flowid = _options.flowid
						formData.fullBizcode = _options.fullBizcode
					}
					
					//附加数据
					if(_options.externalValue){
						$.extend(formData,_options.externalValue)
					}
					var _data = $.toJSON(formData);
					ajaxServ.runAjax({
						url : _url,
						contentType : 'json',
						data : _data,
						callback:function(data){_callback(data)}
					})
				},
				/**
				 * 更新datagrid对象指定行的数据
				 * @argument options.flag
				 * 			  按钮禁用标志
				 * @param _options.grid
				 *            目标列表对象				 
				 * @param _options.window          
				 *            目标窗口对象
				 * @param _options.data
				 *            待添加的数据对象
				 * @param _options.btn
				 * 			  目标命令按钮
				 * @param _options.flowHistoricUrl
				 * 			  流程执行信息url        
				 * @return 更新成功返回1，失败返回空值
				 */
				edit:function(_options){
					var _grid = _options.grid,_window = _options.window,_btn = _options.btn,
					    _data = _options.data,_flag = _options.flag,
					    _width,_height;
					    
					var _editDefault = {
						width:800,
						height:600,
						flag:true,
						modal:true,
						closable:true
					}
					
					_options =$.extend({},_editDefault,_options)
					
					
					//按钮状态控制
					if (_flag == true) {
						$(_btn).linkbutton('enable');
					} else {
						$(_btn).linkbutton('disable');
					}
	
					var selectedRecord = $(_grid).datagrid('getSelected');

					selectedRecord = selectedRecord == null
							? _data
							: selectedRecord;

					
					if (selectedRecord) {
						
						$(_window).window(_options)
						var _form = $(_window).find('form')
						$(_form).form('clear');
						$(_form).form('load', selectedRecord);
											
						$(_window).window('open').window('hcenter').window('vcenter')
						
					} else {
						msgServ.Msgslide('请选择要操作的记录');
					}
				},
				
				
				/**
				 * 更新datagrid对象指定行的数据
				 * @argument options.flag
				 * 			  按钮禁用标志
				 * @param options.grid
				 *            目标列表对象				 
				 * @param options.window          
				 *            目标窗口对象
				 * @param options.data
				 *            待添加的数据对象
				 * @param options.btn
				 * 			  目标命令按钮           
				 * @return 更新成功返回1，失败返回空值
				 */
				add:function(_options){
					var _window = _options.window		    
					    
					var _editDefault = {
						width:800,
						height:600,						
						modal:true,
						closable:true
					}
					
					_options =$.extend({},_editDefault,_options)
					
					$(_window).window(_options)						
					var _form = $(_window).find('form')
					$(_form).form('clear');						
					$(_window).window('hcenter')
					$(_window).window('vcenter')
					$(_window).window('open')
					
				},
				
				/**
				 * 更新datagrid对象指定行的数据				 
				 * @param _options.grid
				 *            目标列表对象				 
				 * @param _options.window          
				 *            目标窗口对象
				 * @param _options.flag
				 * 			  目标窗口编辑标志 true 为编辑，false 为新增	
				 * @param _options.width
				 * 			  目标窗口宽度
				 * @param _options.height
				 * 			  目标窗口高度
				 * @param _options.existCheckElement
				 * 			  目标窗口是否已经初始化
				 * @param _options.data
				 * 			  数据对象
				 * @return 更新成功返回1，失败返回空值
				 */
				windowEdit:function(_options){
					var _grid = _options.grid,_window = _options.window	
					
					var _height = $(document).height()
					var _width = $(document).width()
					if(window.console){
						console.log(' current widown width:'+_width +', height:'+_height)
					}
					  
					var _editDefault = {
						width:800,
						height:600,
						flag:true,
						modal:true,
						closable:true
					}
					
					_options =$.extend({},_editDefault,_options)				
					
					var selectedRecord
					if(_height && _height<=700)
						_options.height = _height-50
					
					if(_options.flag==true){
						var records = $(_grid).datagrid('getSelections');
						if(records.length>0){
							 
							if(records.length==1){
								selectedRecord = records[0];
							}else{
								msgServ.Msgslide('选择了多条记录，操作无法执行');
								return
							}
							
						}else{
							if(_options.data){
								selectedRecord =_options.data
							}else{							
								msgServ.Msgslide('请选择要操作的记录');
								return
							}
						}
					}
					$(_window).window(_options);
					$(_window).window('open').window('vcenter').window('hcenter')					
					
					
					if(_options.existCheckElement){
						var isOpend = $(_window).find(_options.existCheckElement);
						if(isOpend.length>0){
							$(_window).window('refresh')
						}
					}
				},
				
				/**
				 * 弹窗更新datagrid对象指定行的数据				 
				 * @param _options.grid
				 *            目标列表对象				 
				 * @param _options.window          
				 *            目标窗口对象
				 * @param _options.flag
				 * 			  目标窗口编辑标志 true 为编辑，false 为新增	
				 * @param _options.width
				 * 			  目标窗口宽度
				 * @param _options.height
				 * 			  目标窗口高度
				 * @param _options.existCheckElement
				 * 			  目标窗口是否已经初始化
				 * @param _options.data
				 * 			  数据对象
				 * @return 更新成功返回1，失败返回空值
				 */
				windowEditCenter:function(_options){
					var _grid = _options.grid,_window = _options.window	
					
					var _height = $(document).height()
					var _width = $(document).width()
					if(window.console){
						console.log(' current widown width:'+_width +', height:'+_height)
					}
					  
					var _editDefault = {
						width:800,
						height:600,
						flag:true,
						modal:true,
						closable:true
					}
					
					_options =$.extend({},_editDefault,_options)				
					
					var selectedRecord
					if(_height && _height<=700)
						_options.height = _height-50
					
					if(_options.flag==true){
						var records = $(_grid).datagrid('getSelections');
						if(records.length>0){
							 
							if(records.length==1){
								selectedRecord = records[0];
							}else{
								msgServ.Msgslide('选择了多条记录，操作无法执行');
								return
							}
							
						}else{
							if(_options.data){
								selectedRecord =_options.data
							}else{							
								msgServ.Msgslide('请选择要操作的记录');
								return
							}
						}
					}
					$(_window).window(_options);
//					$(_window).window('open').window('vcenter').window('hcenter')					
					
					
					if(_options.existCheckElement){
						var isOpend = $(_window).find(_options.existCheckElement);
						if(isOpend.length>0){
							$(_window).window('refresh')
						}
					}
				},
				
				/**
				 * bootstrap 弹窗方法，bootstrap框架必须调用该方法，否则弹窗会执行多次				 
				 * @param _options.grid
				 *            目标列表对象				 
				 * @param _options.window          
				 *            目标窗口对象
				 * @param _options.flag
				 * 			  目标窗口编辑标志 true 为编辑，false 为新增	
				 * @param _options.width
				 * 			  目标窗口宽度
				 * @param _options.height
				 * 			  目标窗口高度
				 * @param _options.existCheckElement
				 * 			  目标窗口是否已经初始化
				 * @param _options.data
				 * 			  数据对象
				 * @return 更新成功返回1，失败返回空值
				 */
				bsWindowEdit:function(_options){
					var _grid = _options.grid,_window = _options.window	
					
					var _height = $(window).height()
					var _width = $(document).width()
					if(window.console){
						console.log(' current widown width:'+_width +', height:'+_height)
					}
					  
					var _editDefault = {
						width:800,
						height:600,
						flag:true,
						modal:true,
						closable:true
					}
					
					_options =$.extend({},_editDefault,_options)				
					
					var selectedRecord
					if(_height)
						_options.height = _height-150
					
					if(_options.flag==true){
						var records = $(_grid).datagrid('getSelections');
						if(records.length>0){
							 
							if(records.length==1){
								selectedRecord = records[0];
							}else{
								msgServ.Msgslide('选择了多条记录，操作无法执行');
								return
							}
							
						}else{
							if(_options.data){
								selectedRecord =_options.data
							}else{							
								msgServ.Msgslide('请选择要操作的记录');
								return
							}
						}
					}
					$(_window).window(_options).window('vcenter').window('hcenter')					
					
					
					if(_options.existCheckElement){
						var isOpend = $(_window).find(_options.existCheckElement);
						if(isOpend.length>0){
							$(_window).window('refresh')
						}
					}
				},
				
				delConfirm:function(){
					$.messager.confirm('警告', '确定执行删除操作?', function(r){
						
							return r;
						
					});
					
					return 
				},
				
				
				
				/**
				 * 删除列表中的选定行
				 * 
				 * @param _options.target
				 *            datagrid组件名称
				 * @param _options.url
				 * 			  删除操作url
				 * @param _options.container
				 *            表单父级容器
				 * @param _options.data
				 * 			  删除的json格式数据
				 * @param options.index
				 *            目标行序号
				 *            
				 * @param _options.auditEnable
				 * @param _options.callback
				 * 				回调函数
				 * 
				 * @param _options.evt
				 * 				按钮事件
				 * @return 删除成功返回1，失败返回空值
				 */
				delRow : function(_options) {
					
					
					var retVal,tid, _data ;

					var _target = elServ.getTarget(_options);

					// 判断目标对象是否为空
					if (_target != null) {

						//判断是否选中行
						var records = $(_target).datagrid('getSelections');
			
						if(records.length>0){
							var selectedRecord = records[0];
							//判断审核标志
							if(_options.auditEnable){
								if(!private_method.checkStatus({records:records,status:0})){	
									if(_options.callback){
										if(_options.evt && _options.evt.currentTarget){
											$(_options.evt.currentTarget).linkbutton('enable')
										}
										_options.callback({error:'audit'})
									}else{
										if(_options.evt && _options.evt.currentTarget){
											$(_options.evt.currentTarget).linkbutton('enable')
										}
										msgServ.Msgslide('已审核记录不能进行删除操作！');
									}
									return
								}
							}
							
							
							if(records.length==1){
								_data = {id:selectedRecord.id};	
							}else{
								$.each(records,function(i,el){
									tid=!tid?el.id:tid+','+el.id
								})
								_data = {ids:tid}
							}
							
						}else{
							if(_options.callback){
								if(_options.evt && _options.evt.currentTarget){
									$(_options.evt.currentTarget).linkbutton('enable')
								}
								_options.callback({error:'select'})
							}else{
								if(_options.evt && _options.evt.currentTarget){
									$(_options.evt.currentTarget).linkbutton('enable')
								}
								msgServ.Msgslide('请选择要删除的记录');
							}
							return
						}
						// 判断待添加数据是否为空					
					}
					
					$.messager.confirm('警告', '确定执行删除操作?', function(r){
						
						if( r){					
							ajaxServ.runAjax({
								url:_options.url,
							 	contentType:'form',
							 	data:_data,
							 	callback:function(){						 		
									$(_target).datagrid('clearSelections');
									$(_target).datagrid('reload');
									if(_options.callback){
										_options.callback({success:'success'})
										if(_options.evt && _options.evt.currentTarget){
											$(_options.evt.currentTarget).linkbutton('enable')
										}
									}else{
										msgServ.Msgslide('删除记录操作成功！');
										if(_options.evt && _options.evt.currentTarget){
											$(_options.evt.currentTarget).linkbutton('enable')
										}
									}
							 	}
							})
						}
					})
					
				},
				
				checkAuditStatus:function(record){
					
					
					//审核状态判断
					if(record && record.status){
						var _status =record.status
						if(_status && (_status>0)){
							
							return true
						}
					}
					
					return false
				},
				
				/**
				 * 更新datagrid对象指定行的数据				 
				 * @param _options.grid
				 *            目标列表对象				 
				 * @param _options.url          
				 *            目标窗口对象				 
				 * @param _options.data
				 * 			  数据对象
				 * @param _options.status
				 * 			  审核状态
				 * @param _options.evt
				 * 			  按钮事件
				 * @return 更新成功返回1，失败返回空值
				 */
				auditList:function(_options){
					var _grid = _options.grid,_window = _options.window	,records,selectedRecord				
										  
					var _editDefault = {
						width:800,
						height:600,
						flag:true,
						modal:true,
						closable:true
					}
					
					_options =$.extend({},_editDefault,_options)				
					
					records = $(_grid).datagrid('getSelections');
					
					if(records.length>0){
						selectedRecord = records[0]
						
						//检查批量审核可执行状态
						var ids = private_method.checkStatus({records:records,status:_options.status});
						
						
						if(ids){
							
							var _data = {ids:ids,status:_options.status}
							var _param = {
								url:_options.url,
								data:_data,
								success:function(data){
									msgServ.Msgslide('操作成功');
									$(_grid).datagrid('clearSelections')
									$(_grid).datagrid('reload')
									
									if(_options.evt && _options.evt.currentTarget){
										$(_options.evt.currentTarget).linkbutton('enable');
									}
								}
							}
							
							$.messager.confirm('警告', '通过审核后将无法再次修改内容，确定执行审核操作?', function(r){
						
								if( r){					
									$.ajax(_param)
								}
							})
							//执行批量审核							
						}else{
						
							if(_options.evt && _options.evt.currentTarget){
								$(_options.evt.currentTarget).linkbutton('enable');
							}
						}
					}else{
						if(_options.evt && _options.evt.currentTarget){
							$(_options.evt.currentTarget).linkbutton('enable');
						}
						msgServ.Msgslide('请选择需操作的记录');
					}					
				}
			}
			
			var private_method = {
				
				/**
				 * 检查可执行的操作状态
				 * @param _options.records	数据集合
				 * @param _options.status   审核状态标志
				 */
				checkStatus:function(_options){
					var retVal = false,ids
					//参数判断
					if(_options && _options.records ){
						
						for(var i=0;i<_options.records.length;i++){
							var el = _options.records[i];
							
							if(el.id){
								ids=!ids?el.id:ids+','+el.id	
							}
							
							//生成id字符串	
							retVal = ids
							
							//未执行审核操作
							if(!el.status){
								continue;	
							}
							
							//判断是否存在已审核通过的数据							
							if(el.status && el.status==1){
								msgServ.Msgslide('选择了已审核的记录，操作无法执行');
								retVal = false;
								break;
							}							
							
						}						
												
					}
					
					return retVal;
					
				},
				//datagrid加载完后合并指定单元格
				mergeCells:function (data){
				    var arr =[{mergeFiled:"SERIALNUM",premiseFiled:"PROJECTID"},    //合并列的field数组及对应前提条件filed（为空则直接内容合并）
				              {mergeFiled:"PROJECTNAME",premiseFiled:"PROJECTID"},
				              {mergeFiled:"ORGSTARTTIME",premiseFiled:"PROJECTID"},
				              {mergeFiled:"ORGUNIT",premiseFiled:"PROJECTID"}
				             ];    
				    var dg = $("#datagrid1");    //要合并的datagrid中的表格id
				    var rowCount = dg.datagrid("getRows").length;
				    var cellName;
				    var span;
				    var perValue = "";
				    var curValue = "";
				    var perCondition="";
				    var curCondition="";
				    var flag=true;
				    var condiName="";
				    var length = arr.length - 1;
				    for (i = length; i >= 0; i--) {
				        cellName = arr[i].mergeFiled;
				        condiName=arr[i].premiseFiled;
				        if(isNotNull(condiName)){
				            flag=false;
				        }
				        perValue = "";
				        perCondition="";
				        span = 1;
				        for (row = 0; row <= rowCount; row++) {
				            if (row == rowCount) {
				                curValue = "";
				                curCondition="";
				            } else {
				                curValue = dg.datagrid("getRows")[row][cellName];
				                /* if(cellName=="ORGSTARTTIME"){//特殊处理这个时间字段
				                    curValue =formatDate(dg.datagrid("getRows")[row][cellName],"");
				                } */
				                if(!flag){
				                    curCondition=dg.datagrid("getRows")[row][condiName];
				                }
				            }
				            if (perValue == curValue&&(flag||perCondition==curCondition)) {
				                span += 1;
				            } else {
				                var index = row - span;
				                dg.datagrid('mergeCells', {
				                    index : index,
				                    field : cellName,
				                    rowspan : span,
				                    colspan : null
				                });
				                span = 1;
				                perValue = curValue;
				                if(!flag){
				                    perCondition=curCondition;
				                }
				            }
				        }
				    }
				},
				/**
				* EasyUI DataGrid根据字段动态合并单元格
				* @param _options.tableID 要合并table的id
				* @param _options.colList 要合并的列,用逗号分隔(例如："name,department,office");
				*/
				mergeCellsByField:function (_options) {
				   
				   
				    var tmpA;
				    var tmpB;
				    var PerTxt = "";
				    var CurTxt = "";
				    var alertStr = "";
					var tableID = _options.tableID
					var colList = _options.colList
					var ColArray = colList.split(",");
					var tTable = $("#" + tableID);
				    var TableRowCnts = tTable.datagrid("getRows").length;
				    for (var j = ColArray.length - 1; j >= 0; j--) {
				        PerTxt = "";
				        tmpA = 1;
				        tmpB = 0;
				
				        for (var i = 0; i <= TableRowCnts; i++) {
				            if (i == TableRowCnts) {
				                CurTxt = "";
				            }
				            else {
				                CurTxt = tTable.datagrid("getRows")[i][ColArray[j]];
				            }
				            if (PerTxt == CurTxt) {
				                tmpA += 1;
				            }
				            else {
				                tmpB += tmpA;
				                
				                tTable.datagrid("mergeCells", {
				                    index: i - tmpA,
				                    field: ColArray[j],　　//合并字段
				                    rowspan: tmpA,
				                    colspan: null
				                });
				                tTable.datagrid("mergeCells", { //根据ColArray[j]进行合并
				                    index: i - tmpA,
				                    field: "Ideparture",
				                    rowspan: tmpA,
				                    colspan: null
				                });
				               
				                tmpA = 1;
				            }
				            PerTxt = CurTxt;
				        }
				    }
				}
			}
			return public_method;

		});